﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Если НЕ МобильныйАвтономныйСервер Тогда

// Процедура сохраняет сформированный отчет в виде табличного документа MXL в регистр сведений СнимкиОтчетов
//
// Параметры:
//  РезультатОтчета - ТабличныйДокумент - снимок отчета в виде табличного документа MXL
//  НастройкиОтчета - см. ВариантыОтчетов.ОписаниеОтчета.
//
Процедура СохранитьСнимокОтчетаПользователя(РезультатОтчета, НастройкиОтчета) Экспорт

	УстановитьПривилегированныйРежим(Истина);
	
	МенеджерЗаписи = РегистрыСведений.СнимкиОтчетов.СоздатьМенеджерЗаписи();
	
	МенеджерЗаписи.Пользователь = Пользователи.ТекущийПользователь();
	МенеджерЗаписи.Отчет = НастройкиОтчета.ОтчетСсылка;
	МенеджерЗаписи.Вариант = НастройкиОтчета.ВариантСсылка;
	
	МенеджерЗаписи.ХешПользовательскойНастройки = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(
		НастройкиОтчета.СвойстваРезультата.КомпоновщикНастроек.ПользовательскиеНастройки);
	МенеджерЗаписи.ПользовательскаяНастройка = Новый ХранилищеЗначения(НастройкиОтчета.СвойстваРезультата.КомпоновщикНастроек.ПользовательскиеНастройки);

	МенеджерЗаписи.РезультатОтчета = Новый ХранилищеЗначения(РезультатОтчета);
	МенеджерЗаписи.ДатаАктуальности = ТекущаяДатаСеанса();
	МенеджерЗаписи.ДатаПоследнегоПросмотра = ТекущаяДатаСеанса();
	
	МенеджерЗаписи.Записать();

КонецПроцедуры

// Процедура обновляет снимки отчетов пользователя
//
// Параметры:
//  ПараметрыЗаполнения - Структура:
//   * Пользователь - СправочникСсылка.Пользователи - пользователь, для которого обновляются снимки отчетов
//   * СнимкиОтчетов - ТаблицаЗначений:
//    ** Пользователь - СправочникСсылка.Пользователи
//    ** Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//    ** Вариант - СправочникСсылка.ВариантыОтчетов
//    ** ХешПользовательскойНастройки - Число
//   * ИмяСправочникаВариантыОтчетов - Строка - имя справочника, хранящего варианты отчетов (если это не справочник ВариантыОтчетов)
//  АдресХранилища - Строка - используется для возможности выполнения в фоновом задании.
//
Процедура ОбновитьСнимкиОтчетовПользователя(ПараметрыЗаполнения, АдресХранилища) Экспорт

	УстановитьПривилегированныйРежим(Истина);
	
	МодульОценкаПроизводительности = Неопределено;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда
		МодульОценкаПроизводительности = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительности");
		ОписаниеЗамера = МодульОценкаПроизводительности.НачатьЗамерДлительнойОперации(
			"ОбновитьСнимкиОтчетовПользователя");
	КонецЕсли;
	
	ИмяСправочникаВариантыОтчетов = "";
	ПараметрыЗаполнения.Свойство("ИмяСправочникаВариантыОтчетов", ИмяСправочникаВариантыОтчетов);
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Пользователь", ПараметрыЗаполнения.Пользователь);
	Если ПараметрыЗаполнения.Свойство("СнимкиОтчетов") Тогда
		Запрос.УстановитьПараметр("СнимкиОтчетов", ПараметрыЗаполнения.СнимкиОтчетов);
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	СнимкиОтчетов.Пользователь КАК Пользователь,
		|	СнимкиОтчетов.Отчет КАК Отчет,
		|	СнимкиОтчетов.Вариант КАК Вариант,
		|	СнимкиОтчетов.ХешПользовательскойНастройки КАК ХешПользовательскойНастройки
		|ПОМЕСТИТЬ СохраненныеСнимкиОтчетов
		|ИЗ
		|	&СнимкиОтчетов КАК СнимкиОтчетов
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Пользователь,
		|	Отчет,
		|	Вариант,
		|	ХешПользовательскойНастройки
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	СнимкиОтчетов.Пользователь КАК Пользователь,
		|	СнимкиОтчетов.Отчет КАК Отчет,
		|	СнимкиОтчетов.Вариант КАК Вариант,
		|	СнимкиОтчетов.Вариант.КлючВарианта КАК КлючВарианта,
		|	СнимкиОтчетов.ХешПользовательскойНастройки КАК ХешПользовательскойНастройки,
		|	СнимкиОтчетов.ПользовательскаяНастройка КАК ПользовательскаяНастройка
		|ИЗ
		|	РегистрСведений.СнимкиОтчетов КАК СнимкиОтчетов
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ СохраненныеСнимкиОтчетов КАК СохраненныеСнимкиОтчетов
		|		ПО СнимкиОтчетов.Пользователь = СохраненныеСнимкиОтчетов.Пользователь
		|			И СнимкиОтчетов.Отчет = СохраненныеСнимкиОтчетов.Отчет
		|			И СнимкиОтчетов.Вариант = СохраненныеСнимкиОтчетов.Вариант
		|			И СнимкиОтчетов.ХешПользовательскойНастройки = СохраненныеСнимкиОтчетов.ХешПользовательскойНастройки
		|ГДЕ
		|	СнимкиОтчетов.Пользователь = &Пользователь
		|	И СнимкиОтчетов.Вариант ССЫЛКА Справочник.ВариантыОтчетов";
	Иначе	
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	СнимкиОтчетов.Пользователь КАК Пользователь,
		|	СнимкиОтчетов.Отчет КАК Отчет,
		|	СнимкиОтчетов.Вариант КАК Вариант,
		|	СнимкиОтчетов.Вариант.КлючВарианта КАК КлючВарианта,
		|	СнимкиОтчетов.ХешПользовательскойНастройки КАК ХешПользовательскойНастройки,
		|	СнимкиОтчетов.ПользовательскаяНастройка КАК ПользовательскаяНастройка
		|ИЗ
		|	РегистрСведений.СнимкиОтчетов КАК СнимкиОтчетов
		|ГДЕ
		|	СнимкиОтчетов.Пользователь = &Пользователь
		|	И СнимкиОтчетов.Вариант ССЫЛКА Справочник.ВариантыОтчетов";
	КонецЕсли;
	Если Не ПустаяСтрока(ИмяСправочникаВариантыОтчетов) Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВариантыОтчетов", ИмяСправочникаВариантыОтчетов);
	КонецЕсли;
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
	
		МенеджерЗаписи = РегистрыСведений.СнимкиОтчетов.СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка, "Пользователь, Отчет, Вариант, ХешПользовательскойНастройки");
	
		ПараметрыФормированияОтчета = ВариантыОтчетов.ПараметрыФормированияОтчета();
	
		ПараметрыФормированияОтчета.СсылкаВарианта = Выборка.Вариант;
		ПараметрыФормированияОтчета.СсылкаОтчета = Выборка.Отчет;
		ПараметрыФормированияОтчета.КлючВарианта = Выборка.КлючВарианта;
		ПараметрыФормированияОтчета.ПользовательскиеНастройкиКД = Выборка.ПользовательскаяНастройка.Получить();
		Если Не ПустаяСтрока(ИмяСправочникаВариантыОтчетов) Тогда
			КлючВарианта = Выборка.Отчет.Имя;
			ПараметрыФормированияОтчета.КлючВарианта = КлючВарианта;
			ПараметрыФормированияОтчета.СсылкаВарианта = ВариантыОтчетов.ВариантОтчета(Выборка.Отчет, КлючВарианта);
		КонецЕсли;
		
		Формирование = ВариантыОтчетов.СформироватьОтчет(ПараметрыФормированияОтчета, Истина, Ложь);
		
		Если Не Формирование.Успех Тогда
			ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление снимков отчетов'", ОбщегоНазначения.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,
			ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Выборка.Отчет),
			Выборка.Вариант,
			Формирование.ТекстОшибки);
		КонецЕсли;
		
		МенеджерЗаписи.РезультатОтчета = Новый ХранилищеЗначения(Формирование.ТабличныйДокумент, Новый СжатиеДанных);
		МенеджерЗаписи.ПользовательскаяНастройка = Выборка.ПользовательскаяНастройка;
		МенеджерЗаписи.ДатаАктуальности = ТекущаяДатаСеанса();
		МенеджерЗаписи.ДатаПоследнегоПросмотра = ТекущаяДатаСеанса();
		МенеджерЗаписи.ОшибкаОбновленияОтчета = Не Формирование.Успех;
		МенеджерЗаписи.Записать();
	
	КонецЦикла;
	
	Если МодульОценкаПроизводительности <> Неопределено Тогда
		МодульОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, Выборка.Количество());
	КонецЕсли;

КонецПроцедуры

#КонецЕсли

// Функция возвращает список снимков отчетов пользователя
//
// Параметры:
//  Пользователь - СправочникСсылка.Пользователи - пользователь, для которого формируется список снимков отчетов
//  ИмяСправочникаВариантыОтчетов - Строка - имя справочника, хранящего варианты отчетов (если это не справочник ВариантыОтчетов)
// Возвращаемое значение:
//  ТаблицаЗначений:
//   * Пользователь - СправочникСсылка.Пользователи - пользователь снимка отчета
//   * Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных - идентификатор отчета
//   * Вариант - ОпределяемыйТип.ВариантОбновляемогоОтчета - вариант отчета
//   * НаименованиеВарианта - Строка - наименование варианта отчета (для автономного режима)
//   * ХешПользовательскойНастройки - Число  - хеш-сумма пользовательской настройки
//
Функция СнимкиОтчетовПользователя(Пользователь, ИмяСправочникаВариантыОтчетов) Экспорт

	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Пользователь", Пользователь);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	СнимкиОтчетов.Пользователь КАК Пользователь,
	|	СнимкиОтчетов.Отчет КАК Отчет,
	|	СнимкиОтчетов.Вариант КАК Вариант,
	|	СнимкиОтчетов.Вариант.Наименование КАК НаименованиеВарианта,
	|	СнимкиОтчетов.ХешПользовательскойНастройки КАК ХешПользовательскойНастройки,
	|	СнимкиОтчетов.ДатаАктуальности КАК ДатаАктуальности
	|ИЗ
	|	РегистрСведений.СнимкиОтчетов КАК СнимкиОтчетов
	|ГДЕ
	|	СнимкиОтчетов.Пользователь = &Пользователь
	|	И СнимкиОтчетов.Вариант ССЫЛКА Справочник.ВариантыОтчетов
	|	И НЕ СнимкиОтчетов.Вариант.Наименование ЕСТЬ NULL
	|
	|УПОРЯДОЧИТЬ ПО
	|	Отчет,
	|	Вариант,
	|	ХешПользовательскойНастройки";
	Если Пользователь = Неопределено Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "СнимкиОтчетов.Пользователь = &Пользователь", "ИСТИНА");
	КонецЕсли;
	Если Не ПустаяСтрока(ИмяСправочникаВариантыОтчетов) Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВариантыОтчетов", ИмяСправочникаВариантыОтчетов);
	КонецЕсли;

	Возврат Запрос.Выполнить().Выгрузить();

КонецФункции

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
	
	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЭтоАвторизованныйПользователь(Пользователь)";
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

#КонецОбласти

#КонецОбласти

#КонецЕсли
